package Vue;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

import Controllers.ControllerClient;
import Serveur.ServeurServices;
import Serveur.ServeurServicesImpl;

public class Navigateur implements ActionListener,Observer{

	private ControllerClient controllerClient;
	private ServeurServices serveur ;
	
	private MonPanel panneau;
	private JComboBox listeServices;
	private JButton playBut;
	private JButton stopBut;
		
	public Navigateur(ControllerClient cc){
		
		this.controllerClient = cc;
		controllerClient.addObserver(this);
		construireIHM() ;
	}
	
	public void construireIHM() {
			
		JFrame cadre = new JFrame("Navigateur RMI");
		/*Initialisation des panels*/
		panneau = new MonPanel();
		JPanel bouttonPanel = new JPanel();
		
		panneau.setBackground(Color.white);
		panneau.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY,18));
		/*On remplit la combobox*/
		Object[] services = getListeServices();
		listeServices = new JComboBox(services);
		
		/*Initialisation du Panel de boutton*/
		bouttonPanel.setLayout(new GridLayout());
		playBut = new JButton("Play");
		stopBut = new JButton("Stop");
		bouttonPanel.add(playBut);
		bouttonPanel.add(stopBut);

		/*Ajout des differents panels au cadre*/
		cadre.getContentPane().add(BorderLayout.NORTH, listeServices);
		cadre.getContentPane().add(BorderLayout.CENTER, panneau);
		cadre.getContentPane().add(BorderLayout.SOUTH, bouttonPanel);
	
		playBut.addActionListener(this);
		stopBut.addActionListener(this);
		listeServices.addActionListener(this);
		cadre.setSize(500,500);
		cadre.setVisible(true);
	}

	/*
	 * Le client doit acc�der � l'objet souche, 
	 * puisque c'est sur cette entit� qu'il va appeler les m�thodes.
	 * 
	 * le client consulte le registre RMI : Naming.lookup("rmi://127.0.0.1/ServeurServices");
	 * "ServeurServices" est le nom sous lequel le service a �t� enregistr�
	 * 
	 * le registre RMI retourne l'objet souche comme valeur de retour de la m�thode lookup()
	 * et RMI le d�s�rialise automatiquement. la classe de la souche (g�n�r�e) doit �tre sur le client.
	 * 
	 * le client invoque une m�thode sur la souche comme si elle �tait le service r�el :
	 * "serveur.getListeServices()"
	 */
	Object[] getListeServices() {

		Object obj = null;
		Object[] services = null;
		
		try {
			
			//obj = Naming.lookup("rmi://127.0.0.1/ServeurServices");
			obj = Naming.lookup("ServeurServices");
			
		}
		catch(Exception ex) {
			ex.printStackTrace();
		}
		
		serveur = (ServeurServices) obj;

		try {

			services = serveur.getListeServices();

		} catch(Exception ex) {
			ex.printStackTrace();
		}
		return services;
	}


	@Override
	public void actionPerformed(ActionEvent ev) {
		
		if (ev.getSource().equals(playBut))
			controllerClient.play();
		else if (ev.getSource().equals(stopBut))
			controllerClient.stop();
		else if (ev.getSource().equals(listeServices))
			controllerClient.chargerService(listeServices.getSelectedItem());
	}
	
	public static void main(String[] args) {

		ControllerClient cc;
		try {
			cc = new ControllerClient(new ServeurServicesImpl());
		} catch (RemoteException e) {
			e.printStackTrace();
			cc = null ;
		}
		new Navigateur(cc) ;
	}

	@Override
	public void update(Observable o, Object arg) {
		
		if ("serviceNull".equals(controllerClient.getMsg()))
				javax.swing.JOptionPane.showMessageDialog(null,"Veuillez selectionner un service"); 
		else
			panneau.repaint();
	}
}


